home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / meminit2.arc / MEMINIT.ASM
Assembly Source File  |  1987-08-06  |  4KB  |  129 lines

  1.      PAGE  57,132
  2.  
  3. ;
  4. ; This program was initially developed to minimize the boot up time on a PC.
  5. ; It is adaptible to increasing the memory size DOS sees to greater (or less)
  6. ; than 640K
  7. ;
  8. ;
  9. ;   SET THE INTERNAL PC SWITCHES TO 64K MEMORY. THIS PROGRAM WILL
  10. ;   UPDATE DOS 2.X AND 3.X MEMORY CONTROL BLOCKS TO REFLECT ACTUAL
  11. ;   MEMORY SIZE.
  12. ;
  13. ;   THIS SHOULD BE THE FIRST PROGRAM IN YOUR AUTOEXEC.BAT FILE, AND IS
  14. ;   DESIGNED TO BE A LO-LOADING .EXE PROGRAM
  15. ;
  16. ;   ROM POST WILL ONLY CHECK THE FIRST 64 K OF MEM, REDUCING POWER ON TIME
  17. ;   TO ABOUT 20 SECONDS.
  18. ;
  19. ;
  20. ;
  21. STACK     SEGMENT PARA STACK 'STACK'
  22.      DW    128 DUP (?)
  23. STACK     ENDS
  24.  
  25. MEMINIT  SEGMENT PARA 'CODE'
  26.      ASSUME CS:MEMINIT,DS:MEMINIT,SS:STACK
  27.  
  28. LOCORE     EQU   40H           ;BASE OF DOS VARIABLES
  29. SYSSIZE  EQU   WORD PTR ES:[19]    ;WHERE DOS KEEPS MEM INFO
  30. IOCSIZE  EQU   WORD PTR ES:[21]    ;IO CHANNEL MEMORY SIZE
  31.  
  32.  
  33. ORIGSYS  DW    0           ;SAVE AREA - ORIGINAL CPU MEMORY
  34. ORIGIOC  DW    0           ;SAVE AREA - ORIGINAL IO CHANNEL MEMORY
  35. MYOWNPSP DW    0           ;SEGMENT ADDRESS FOR THIS PGMS PSP
  36.  
  37. SIZMSG     DB    'MEM SIZE RESET',10,13,'$'
  38.  
  39. ;*******************************************************************************
  40. ;
  41. ; INITIALIZE MEMORY SIZE
  42. ;
  43. ;*******************************************************************************
  44. MEM0000  PROC  FAR
  45.      SUB   AX,AX
  46.      PUSH  DS           ;SET UP FAR RETURN TO DOS
  47.      PUSH  AX
  48.      MOV   BX,DS           ;SAVE PSP POINTER
  49.      MOV   AX,CS
  50.      MOV   DS,AX           ;MAKE DS POINT TO CODE SEG
  51.      MOV   MYOWNPSP,BX       ;SAVE PSP POINTER
  52.      MOV   BX,LOCORE       ;LO CORE POINTER
  53.      MOV   ES,BX           ;ES --> TO DOS CORE AREA
  54.      MOV   AX,SYSSIZE       ;GET ROM SET MEM SIZE
  55.      MOV   ORIGSYS,AX
  56.      MOV   BX,IOCSIZE
  57.      MOV   ORIGIOC,BX
  58.      MOV   CL,6
  59.      SHL   AX,CL           ;GET TRUE STARTING MEM SIZE IN PARAS
  60.      SUB   BX,BX
  61.      CLD               ;INSURE DIR FLAG IS FORWARD
  62.      PUSH  DS
  63.      PUSH  ES
  64. ;
  65. ;  SCAN AND CLEAR MEMORY
  66. ;
  67. MEM0120:
  68.      CMP   AX,0A000H       ;OUTSIDE LEGITIMATE MEMORY?
  69.      JE    MEM0140           ;YES-WE HAVE A 640 K MACHINE
  70.      MOV   DS,AX           ;GET WORD TO TRY
  71.      MOV   ES,AX           ;POINT TO WITH ES FOR INITIALIZATION
  72.      MOV   [BX],AX           ;SAVE DATA THERE
  73.      CMP   AX,[BX]           ;SAME DATA THERE?
  74.      JNE   MEM0140           ;NO-END OF CORE FOUND
  75.      PUSH  AX           ;SAVE SEGMENT OF THIS 64 K BLOCK
  76.      MOV   CX,8000H        ;32K WORDS TO ZERO
  77.      SUB   DI,DI           ;INDEX = 0
  78.      SUB   AX,AX           ;DATA = 0 (PREVENT PARITY CHECKS)
  79.      REP   STOSW           ;CLOBBER THE 64 K BLOCK
  80.      POP   AX           ;RESTORE WORKING PARA
  81.      ADD   AX,1000H        ;POINT TO NEXT BLOCK
  82.      JMP   MEM0120           ;DO ANOTHER 64k
  83. MEM0140:
  84.      POP   ES
  85.      POP   DS           ;RESTORE POINTERS
  86.      MOV   CL,6
  87.      SHR   AX,CL           ;CONVERT TOP OF MEM TO KBYTES
  88.      MOV   SYSSIZE,AX       ;SAVE MEM SIZE IN KB
  89.      SUB   AX,ORIGSYS       ;SUBTRACT ORIGINAL SIZE
  90.      ADD   AX,ORIGIOC       ;GET ORIGINAL IO CHANNEL MEM SIZE
  91.      MOV   IOCSIZE,AX       ;SAVE IO CHANNEL SIZE IN LO CORE
  92. ;*******************************************************************************
  93. ;
  94. ; CHASE DOWN LAST MCB AND UPDATE THE MOTHER
  95. ;
  96. ;*******************************************************************************
  97.  
  98.      MOV   BX,SYSSIZE       ;GET DOS MEMORY SIZE (LO CORE)
  99.      MOV   AX,MYOWNPSP       ;GET ADDRESS OF THIS SEGMENT
  100.      DEC   AX           ;-1 FOR POINTER TO MEM CTRL BLK
  101.      PUSH  ES           ;SAVE LO-CORE POINTER
  102. ;
  103. ;  CHASE MEM CTRL BLK CHAIN UNTIL END (BYTE 0 = C'Z') FOUND
  104. ;
  105. MEM0220:
  106.      MOV   ES,AX           ;POINT TO MCB W/ ES
  107.      CMP   BYTE PTR ES:[0],'Z' ;ENDING CONTROL BLOCK?
  108.      JE    MEM0240           ;YES-EXIT CHAIN CHASE
  109.      ADD   AX,ES:[3]       ;ELSE - POINT TO NEXT BLOCK
  110.      INC   AX           ;AND POINT PAST IT BY 16 BYTES
  111.      JMP   MEM0220           ;CONTINUE UNTIL END LOCATED
  112. ;
  113. ;  UPDATE LAST MCB TO REFLECT REAL MEM SIZE
  114. ;
  115. MEM0240:
  116.      MOV   CL,6           ;SHIFT FOR K BYTE CONVERT
  117.      SHL   BX,CL           ;CONVERT TO K
  118.      SUB   BX,AX           ;GET THE ADDITIONAL MEMORY SIZE
  119.      DEC   BX           ;MINUS 1 PARAGRAPH (FIX UP FOR INC AX)
  120.      MOV   ES:[3],BX       ;SAVE MEMORY SIZE IN LAST MCB
  121.      POP   ES           ;RESTORE LO-CORE POINTER
  122.      MOV   DX,OFFSET SIZMSG
  123.      MOV   AH,9           ;DOS PRINT STRING
  124.      INT   21H           ;CALL DOS
  125.      RET               ;ALL DONE
  126. MEM0000  ENDP
  127. MEMINIT  ENDS
  128.      END   MEM0000
  129.